/***
 * API: Interfaz de Integracion hacia el sistema SUB. 
 * Copyright (c) 2011 Alcaldia de Medellin.
 * Subsecretaria de Tecnologia de Informacion. 
 * Todos los Derechos Reservados.
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 */
package defecto;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Clase que aplica el patron Data Access Object, para acceder al web service
 * publicado por accion social que incide en el uso del Bean
 * <code>SipodVO</code>.
 * 
 * @author Consult-Soft S.A.
 * @version 4.0 28/11/2011
 * @since 1.4
 */
public class SipodDAO {
    // ------------------------------------------------------------------------
    // Atributos de Clase
    // ------------------------------------------------------------------------

    private String host = "hades.medellin.gov.co";

    private String port = "8000";

    private String contexto = "Sip";

    private String servlet = "Tester";

    // ------------------------------------------------------------------------
    // Constructores
    // ------------------------------------------------------------------------

    /**
     * Crear una nueva instancia del valueObject beneficiario.
     * 
     * @return BeneficiaryVO la nueva instancia de la clase con los atributos
     *         vacios.
     * 
     */
    public static SipodVO createValueObject() {
	return new SipodVO();
    }

    // ------------------------------------------------------------------------
    // Metodos Publicos
    // ------------------------------------------------------------------------

    /**
     * Crea un DAO para la clase SipodVO sin inicializar.
     */
    public SipodDAO() {
    }

    /**
     * Obtiene los datos de registro de una persona desplazada, registrada en el
     * sistema SIPOD.
     * 
     * Consulta el web service publicado por AccionSocial, en caso de ocurrir
     * una excepcion el sistema informara cual ha sido el problema
     * 
     * @param documentType
     *            tipo de documento del desplazado
     * @param documentNumber
     *            numero de documento del desplazado
     * @return El Bean con la informacion sobre el desplazado
     * @throws SUBException
     *             Si sucede algun evento no soportado por la llamada al web
     *             service
     */
    public SipodVO getRegistry(String documentType, String documentNumber) {
	// Variables locales
	InputStream in = null;
	ConectorHttp con;
	SipodVO desplazado = SipodDAO.createValueObject();
	StringBuffer sb = new StringBuffer();

	try {
	    // Obtiene el inputStream a partir del resultado del request para
	    // el metodoPost
	    con = new ConectorHttp();
	    sb.append("http://");
	    sb.append(host);
	    sb.append(":");
	    sb.append(port);
	    sb.append("/");
	    sb.append(contexto);
	    sb.append("/");
	    sb.append(servlet);
	    sb.append("?tipo=");
	    sb.append(documentType);
	    sb.append("&numero=");
	    sb.append(documentNumber);
	    sb.append("&submit.x=36&submit.y=16");
	    String url = sb.toString();
	    try {
		in = con.metodoGet(url);
		String[] resultado = this.parserHTML(in);
		//Setea las propiedades en el orden que son entregadas por la respuesta html
		desplazado.setTipoDesplazamiento(resultado[7]);
		desplazado.setDeclaracion(resultado[11]);
		desplazado.setEstado(resultado[14]);
		desplazado.setFechaVinculacion(resultado[17]);
		desplazado.setActivo(resultado[9]);
		desplazado.setSeDesplazo(resultado[20]);
		desplazado.setIdPersona(resultado[10]);
		desplazado.setRelacion(resultado[19]);
		desplazado.setDeparMunDeclaracion(resultado[12]);
		desplazado.setFechaDeclaracion(resultado[15]);
		desplazado.setDeparMunExpulcion(resultado[13]);
		desplazado.setFechaDesplaz(resultado[16]);
		desplazado.setSexo(resultado[8]);
		desplazado.setId(resultado[0]);
		desplazado.setNombre1(resultado[3]);
		desplazado.setNombre2(resultado[4]);
		desplazado.setApellido1(resultado[5]);
		desplazado.setApellido2(resultado[6]);
		desplazado.setTipoDocumento(resultado[1]);
		desplazado.setDocumento(resultado[2]);
	    } catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }

	} finally {
	    if (in != null) {
		try {
		    in.close();
		} catch (Exception exc) {
		}
	    }// fin if-close inputstream
	} // fin try catch finally
	return desplazado;
    } // fin metodo registro

    /**
     * Parsea la respuesta html en un array de Strings
     * @param in
     * @return
     * @throws IOException
     */
    public String[] parserHTML(InputStream in) throws IOException {
	String str;
	String tmp;
	int longitud;
	String[] arreglo = new String[21];
	int i = 0;
	BufferedReader bfr = null;
	try {
	    bfr = new BufferedReader(new InputStreamReader(in));

	    while ((str = bfr.readLine()) != null) {
		longitud = str.length();
		tmp = str.substring(longitud - 1);
		if (!tmp.equalsIgnoreCase(">")) {
		    arreglo[i] = str;
		    i++;
		}
	    }
	} finally {
	    bfr.close();// Cierra la conexion con la url
	}
	return arreglo;
    }

    /**
     * @return the host
     */
    public String getHost() {
	return host;
    }

    /**
     * @return the port
     */
    public String getPort() {
	return port;
    }

    /**
     * @return the contexto
     */
    public String getContexto() {
	return contexto;
    }

    /**
     * @return the servlet
     */
    public String getServlet() {
	return servlet;
    }

    /**
     * @param host
     *            the host to set
     */
    public void setHost(String host) {
	this.host = host;
    }

    /**
     * @param port
     *            the port to set
     */
    public void setPort(String port) {
	this.port = port;
    }

    /**
     * @param contexto
     *            the contexto to set
     */
    public void setContexto(String contexto) {
	this.contexto = contexto;
    }

    /**
     * @param servlet
     *            the servlet to set
     */
    public void setServlet(String servlet) {
	this.servlet = servlet;
    }
}